#!usr/bin/env python
# -*- coding: utf-8 -*-
'''
Created on 16 de Nov de 2011

@author: Francisco do Ó
@number: 5202
'''

import csv #Importa funcionalidades para ficheiros csv
import sqlite3 #Importa sqlite3 para criar a base de dados
import re #Importa biblioteca re para tratar caracteres especiais
import commonModule #Importa módulo commonModule - tratamento dos dados estatísticos
import time #Importa biblioteca time para obter tempos de execução

#Listas que vão conter informações dos dados relativos às procuras
one_total = [] 
one_unique = []
two_total = []
two_unique = []
three_unique = []
three_total = []

'''
create_table() - Cria a base de dados e a tabela
Preenche a tabela como conteúdo dos ficheiro
'''
def create_table():
    conn = sqlite3.connect("opusprimum.db")
    c = conn.cursor()
    conn.text_factory = str
    
    c.execute('drop table if exists professores')
    c.execute('''create table if not exists professores (cod_docente integer, nome_docente text,
                                                        ultimo_grau text,curso text,categoria text,
                                                        regime_tempo text,ano_lectivo integer,
                                                        tipo_estab text,
                                                        nome_estab text)''')
    ct = 0
    for fileNumber in range (0,10 + 1):
        filePath = './rebcsv/reb'+ str(fileNumber) +'.csv'
        rowReader = csv.reader(open(filePath, 'rb') ,delimiter = ',')
        rowReader.next() # Skip header line.
        
        for row in rowReader:        
            cod_docente = row[0]
            nome_docente = row[1]
            ultimo_grau  = row[2]
            curso = row[3]
            categoria = row[4]
            regime_tempo = row[5] 
            ano_lectivo = row[6] 
            tipo_estab = row[7]
            nome_estab = row[8].decode('UTF-8')     
            
            try:
                cmd = '''INSERT INTO professores ('cod_docente',
                'nome_docente','ultimo_grau','curso', 'categoria',
                'regime_tempo', 'ano_lectivo', 'tipo_estab', 'nome_estab') 
                values("{0}","{1}","{2}",
                "{3}","{4}","{5}",
                "{6}","{7}","{8}")'''.format(unicode(cod_docente),\
                                       unicode(nome_docente),\
                                       unicode(re.sub('"', '',ultimo_grau)),\
                                       unicode(re.sub('"', '',curso)),\
                                       unicode(categoria),\
                                       unicode(regime_tempo),\
                                       unicode(ano_lectivo),\
                                       unicode(tipo_estab),\
                                       nome_estab)
                c.execute(cmd)              
            except:
                print ct
                print row
                print 'Erro ao introduzir os dados na tabela'
                pass
            ct += 1
            #if ct > 300:
                #break
    conn.commit() 
    conn.close()

'''
create_lists() - Efectua uma query à base de dados e retira toda a informação da tabela
Filtra a informação pretendida e cria três listas com dados, uma para cada procura. 
'''
def create_lists():
    global one_total
    global two_total
    global three_total
    
    oneWriter = csv.writer(open('./lists/one_total.csv', "wb"))  
    twoWriter = csv.writer(open('./lists/two_total.csv', "wb"))  
    threeWriter = csv.writer(open('./lists/three_total.csv', "wb")) 
    
    conn = sqlite3.connect("opusprimum.db")
    c = conn.cursor()
    conn.text_factory = str  
         
    cmd = '''select * FROM Professores'''    
    c.execute(cmd)
      
    for row in c:
        rowOne = str(row[8]).decode('utf-8') , str(row[6]).decode('utf-8')
        rowTwo = str(row[8]).decode('utf-8') , str(row[4]).decode('utf-8'), str(row[6]).decode('utf-8')
        rowThree = str(row[8]).decode('utf-8') ,str(row[2]).decode('utf-8'), str(row[6]).decode('utf-8')
        
        one_total.append(rowOne) 
        two_total.append(rowTwo)
        three_total.append(rowThree) 
        pass   
    
    oneWriter.writerows(one_total)
    twoWriter.writerows(two_total)
    threeWriter.writerows(three_total) 
    
    conn.commit()
    conn.close()

'''
Método main - Chama os métodos acima mencionados e fazendo 
uso das listas criadas executa cada uma das três procuras
'''
def main():
    #t0 = time.time()
    #print 'tempo inicial = '+ str(t0) + 'segundos'
    create_table()
    #print'terminei de preencher a tabela'
    #t00 = time.time()
    #print 'criar a tabela = '+ str((t00 - t0)) + 'segundos'
    create_lists()
    commonModule.query_one(one_unique, one_total)
    #print'terminei de tratar os dados para a procura 1'
    #t1 = time.time()
    #print 'tratar dados query 1 = '+ str((t1 - t0)) + 'segundos'
    commonModule.query_two(two_unique, two_total)
    #print'terminei de tratar os dados para a procura 2'
    #t2 = time.time()
    #print 'tratar dados query 2 = '+ str((t2 - t0)) + 'segundos'
    commonModule.query_three(three_unique, three_total)
    #print'terminei de tratar os dados para a procura 3'
    #t3 = time.time()
    #print 'tratar dados query 3 = '+ str((t3 - t0)) + 'segundos'
    print'terminei de tratar os dados para as procuras'
    
    

#main()
